当前位置: 数据库 > Mysql > 高并发下超卖问题及如何解决

高并发下超卖问题及如何解决

2021-08-29 分类:Mysql 作者:admin 阅读(23)

一般电子商务网站会有团购,秒杀等活动,而这样的活动特点是请求量激增,数以万计的用户会抢购一个商品,这样会面临活动商品库存有限,高并发下如何控制库存不出现超卖的问题。

注意:

  1. 我们的数据存放在MySQL中
  2. 使用的语言是Java

为何会发生超卖

一般库存扣除的逻辑代码如下:

防止超卖我们首先想到的是通过事务去解决这个问题:

上面的事务下执行逻辑其实隐藏一个很大的漏洞-有可能库存会变为负数(即超卖),具体分析如下:

  1. 由于是高并发,假设有三个用户a,b,c同时抢购该物品,并进入到了这个事务中,这三个用户查到的库存数是一样的(MySQL rr级别下总是读取事务开始时的行数据)
  2. 然后进入到update,假设这三个用户同时进入update操作,这个时候由于 行级锁的排他性限制,MySQL会将update操作串行化
  3. 上面update执行完后,有可能会发生库存变为负数的情况(超卖)

高并发下,引入缓存解决超卖

主要思路是:

  1. 首先在团购秒杀开始前将需要的物品库存信息放入缓存中
  2. 使用锁来处理其并发请求
  3. 将缓存中的数据同步到数据库。

我们此处使用redis作为缓存。

应用操作redis减库存的大体思路为:

  1. 首先通过redis api监听相关物品的库存信息,在事务开启前保证该物品库存信息无人修改
  2. 获取现有库存信息,判断库存不为0并且当前库存量大于等于订单所需数量
  3. 满足上述2的话则进行扣除操作
  4. 如果在1的过程中有别人更新了该物品库存信息版本,则重试
  5. 直到库存为0或者剩余库存不满足当前订单扣除数量退出

具体代码如下:

来源:https://www.jianshu.com/p/4ee19a4d2a01

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

支付宝
微信
0

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 - 高并发下超卖问题及如何解决

博客简介

精彩评论

  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    新增一个框架图! http://biji.jinli.vip/wp-content/upl...

    评:新文章!
  • 一位WordPress评论者(6年前 (2020-02-13))

    嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

    评:世界,您好!